package com.blq.snblib.util;

import android.app.Application;
import android.content.Context;
import android.os.Looper;
import android.view.Gravity;
import android.view.View;
import android.widget.Toast;

/**
 * ================================================
 * 作者: SSNB
 * 日期: 2016/8/29
 * 描述:
 * Toast的工具类，线程安全，并且如果同事显示的话只会
 * 显示最后一条，其他的都会被取消掉，所以不要过于密集的使用
 * 使用时需要在Application中调用{@link MToast#init(Application)}方法
 * ================================================
 */
public class MToast {
    private static int INT_MSG_NULL = -1;
    private static Context context;
    private static Toast toast;

    private MToast(){
        throw new IllegalAccessError("不能被初始化");
    }

    /**
     * 只有在Application中调用该方法才能使用该工具
     * @param context 上下文对象
     */
    public static void init(Application context){
        MToast.context = context;
    }

    /**
     * 默认短显示Toast
     * @param msg 要显示的信息
     */
    public static void showShort(String msg){
        toastShowString(msg,false,null,getDefaultGravity(),0,getDefaultMarginTop(),0,0);
    }

    /**
     * 默认长显示Toast
     * @param msg 要显示的信息
     */
    public static void showLong(String msg ){
        toastShowString(msg,true,null,getDefaultGravity(),0,getDefaultMarginTop(),0,0);
    }

    /**
     * 默认短显示Toast
     * @param msg 要显示的信息的ResourceID
     */
    public static void showShort(int msg){
        toastShowInt(msg,false,null,getDefaultGravity(),0,getDefaultMarginTop(),0,0);
    }

    /**
     * 默认长显示Toast
     * @param msg 要显示的信息的ResourceID
     */
    public static void showLong(int msg ){
        toastShowInt(msg,true,null,getDefaultGravity(),0,getDefaultMarginTop(),0,0);
    }

    /**
     * 通过字符长度自动设置显示时间
     * @param msg 要显示的信息
     */
    public static void smartShow(String msg){
        if(msg.length()<20){
            showShort(msg);
        }else{
            showLong(msg);
        }
    }

    /**
     * 左上方显示
     * @param msg 要显示的信息
     * @param isShowLongTime 是否长显示
     */
    public static void showLeftTop(String msg, boolean isShowLongTime){
        toastShowString(msg,isShowLongTime,null,Gravity.START|Gravity.TOP,0,0,0,0);
    }


    /**
     * 左上方显示
     * @param msg 要显示的信息的ResourceID
     * @param isShowLongTime 是否长显示
     */
    public static void showLeftTop(int msg, boolean isShowLongTime){
        toastShowInt(msg,isShowLongTime,null,Gravity.START|Gravity.TOP,0,0,0,0);
    }

    /**
     * 右上方显示
     * @param msg 要显示的信息
     * @param isShowLongTime 是否长显示
     */
    public static void showRightTop(String msg, boolean isShowLongTime){
        toastShowString(msg,isShowLongTime,null,Gravity.END|Gravity.TOP,0,0,0,0);
    }

    /**
     * 右上方显示
     * @param msg 要显示的信息的ResourceID
     * @param isShowLongTime 是否长显示
     */
    public static void showRightTop(int msg, boolean isShowLongTime){
        toastShowInt(msg,isShowLongTime,null,Gravity.END|Gravity.TOP,0,0,0,0);
    }

    /**
     * 右下方显示
     * @param msg 要显示的信息
     * @param isShowLongTime 是否长显示
     */
    public static void showRightBottom(String msg, boolean isShowLongTime){
        toastShowString(msg,isShowLongTime,null,Gravity.END|Gravity.BOTTOM,0,0,0,0);
    }
    /**
     * 右下方显示
     * @param msg 要显示的信息的ResourceID
     * @param isShowLongTime 是否长显示
     */
    public static void showRightBottom(int msg, boolean isShowLongTime){
        toastShowInt(msg,isShowLongTime,null,Gravity.END|Gravity.BOTTOM,0,0,0,0);
    }

    /**
     * 左下方显示
     * @param msg 要显示的信息
     * @param isShowLongTime 是否长显示
     */
    public static void showLeftBottom(String msg, boolean isShowLongTime){
        toastShowString(msg,isShowLongTime,null,Gravity.START|Gravity.BOTTOM,0,0,0,0);
    }
    /**
     * 左下方显示
     * @param msg 要显示的信息的ResourceID
     * @param isShowLongTime 是否长显示
     */
    public static void showLeftBottom(int msg, boolean isShowLongTime){
        toastShowInt(msg,isShowLongTime,null,Gravity.START|Gravity.BOTTOM,0,0,0,0);
    }

    /**
     * 居中显示
     * @param msg 要显示的信息
     * @param isShowLongTime 是否长显示
     */
    public static void showCenter(String msg , boolean isShowLongTime){
        toastShowString(msg,isShowLongTime,null,Gravity.CENTER,0,0,0,0);
    }
    /**
     * 居中显示
     * @param msg 要显示的信息的ResourceID
     * @param isShowLongTime 是否长显示
     */
    public static void showCenter(int msg , boolean isShowLongTime){
        toastShowInt(msg,isShowLongTime,null,Gravity.CENTER,0,0,0,0);
    }

    /**
     * 自定义view显示
     * @param view 要显示的view
     * @param isShowLongTime 是否长显示
     */
    public static void showSimpleCustomView(View view , boolean isShowLongTime){
        showCustomView(view,isShowLongTime,getDefaultGravity(),0,getDefaultMarginTop(),0,0);
    }

    /**
     * 自定义view的显示
     * @param view 要显示的view
     * @param isShowLongTime 是否长显示
     * @param gravity 相对位置
     * @param marginLeft 相对当前位置左边距
     * @param marginTop 相对当前位置上边距
     * @param horizontalMargin 0-1 当前相对于屏幕宽比
     * @param verticalMargin 0-1 当前相对于屏幕高占比
     */
    public static void showCustomView(
            View view,
            boolean isShowLongTime,
            int gravity,
            int marginLeft,
            int marginTop,
            float horizontalMargin,
            float verticalMargin){
        toastShow("",INT_MSG_NULL,isShowLongTime,view,gravity,marginLeft,marginTop,horizontalMargin,verticalMargin);
    }

    public static void showCustomGravity(String msg,
                                         boolean isShowLongTime,
                                         int gravity,
                                         int marginLeft,
                                         int marginTop){
        toastShowString(msg,isShowLongTime,null,gravity,marginLeft,marginTop,0,0);
    }
    public static void showCustomGravity(int msg,
                                         boolean isShowLongTime,
                                         int gravity,
                                         int marginLeft,
                                         int marginTop){
        toastShowInt(msg,isShowLongTime,null,gravity,marginLeft,marginTop,0,0);
    }

    /**
     * 获得默认的位置布局
     * @return
     */
    private static int getDefaultGravity(){
        return 0x00000051;
    }

    /**
     * 获得默认的上边距
     * @return
     */
    private static int getDefaultMarginTop(){
        return 64;
    }

    private static void toastShowString(
            String msg,
            boolean isShowLongTime,
            View view,
            int gravity,
            int marginLeft,
            int marginTop,
            float horizontalMargin,
            float verticalMargin){
        toastShow(msg,INT_MSG_NULL,isShowLongTime,view,gravity,marginLeft,marginTop,horizontalMargin,verticalMargin);
    }
    private static void toastShowInt(
            int msg ,
            boolean isShowLongTime,
            View view,
            int gravity,
            int marginLeft,
            int marginTop,
            float horizontalMargin,
            float verticalMargin){
        toastShow("",msg,isShowLongTime,view ,gravity,marginLeft,marginTop,horizontalMargin,verticalMargin);
    }

    /**
     * 最终toast执行方法
     * @param strMsg String类型的显示信息
     * @param intMsg 要显示信息的ResourceID
     * @param isShowLongTime 是否长时间显示
     * @param view 自定义View
     * @param gravity 位置信息
     * @param marginLeft 相对当前位置左边距
     * @param marginTop 相对当前位置上边距
     * @param horizontalMargin 0-1 当前相对于屏幕宽比
     * @param verticalMargin 0-1 当前相对于屏幕高占比
     */
    private static void toastShow(
            String strMsg,
            int intMsg,
            boolean isShowLongTime,
            View view,
            int gravity,
            int marginLeft,
            int marginTop,
            float horizontalMargin,
            float verticalMargin){

        if(CheckUtil.isMainThread()){
            if(toast!=null){
                toast.cancel();
            }
            if(intMsg==INT_MSG_NULL) {
                toast = Toast.makeText(getContext(), strMsg, isShowLongTime ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT);
            }else{
                toast = Toast.makeText(getContext(), intMsg, isShowLongTime ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT);
            }
            if(view!=null){
                toast.setView(view);
            }
            toast.setGravity(gravity,marginLeft,marginTop);
            toast.setMargin(horizontalMargin,verticalMargin);
            toast.show();
        }else{
            Looper.prepare();
            if(toast!=null){
                toast.cancel();
            }
            if(intMsg==INT_MSG_NULL) {
                toast = Toast.makeText(getContext(), strMsg, isShowLongTime ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT);
            }else{
                toast = Toast.makeText(getContext(), intMsg, isShowLongTime ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT);
            }
            if(view!=null){
                toast.setView(view);
            }
            toast.setGravity(gravity,marginLeft,marginTop);
            toast.setMargin(horizontalMargin,verticalMargin);
            toast.show();
            Looper.loop();
        }

    }

    private static Context getContext(){
        if(context==null){
            throw new IllegalAccessError("请在Application中调用 MToast.init(Application)方法");
        }
        return context;
    }
}
